package $2_1oo;

public class NestedClass {

    public static void main(String[] args) {
        //  内部类  Nested Class，定义在另一个类的内部，所以称为内部类（Nested Class）
        //  Java的内部类分为好几种，通常情况用得不多。
        //  Java的内部类可分为Inner Class、Anonymous Class和Static Nested Class三种：
        //  Inner Class和Anonymous Class本质上是相同的，都必须依附于Outer Class的实例，即隐含地持有Outer.this实例，并拥有Outer Class的private访问权限；
        //  Static Nested Class是独立类，但拥有Outer Class的private访问权限。
        
        //  Inner Class 如果一个类定义在另一个类的内部，这个类就是Inner Class
        //  Inner Class 的实例不能单独存在，必须依附于一个Outer Class的实例
        Outer outer = new Outer("Nested"); // 实例化一个Outer
        Outer.Inner inner = outer.new Inner(); // 实例化一个Inner
        inner.hello();
        
        
        //  Anonymous Class在方法内部，通过匿名类（Anonymous Class）来定义
        outer.asyncHello();
        
        //  Static Nested Class,和Inner Class类似，但是使用static修饰，称为静态内部类（Static Nested Class）
        //  用static修饰的内部类和Inner Class有很大的不同，它不再依附于Outer的实例，而是一个完全独立的类，
        //  因此无法引用Outer.this，但它可以访问Outer的private静态字段和静态方法。如果把StaticNested移到Outer之外，就失去了访问private的权限。
    }

}

class Outer {
    private String name;

    Outer(String name) {
        this.name = name;
    }

    class Inner {
        void hello() {
            System.out.println("Inner Hello, " + Outer.this.name);
        }
    }
    
    void asyncHello() {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.println("async Hello, " + Outer.this.name);
            }
        };
        new Thread(r).start();
    }
}